package com.myacg.core.task;

import java.util.Date;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 单独任务管理器。
 * 顾名思义， 此管理器中的任务并不公用一个线程。通过timer和task的关系， 
 * 进行管理 每一个任务都代表一个
 * @author Administrator
 *
 */
public class AloneTaskManager {
	private  Timer timer;
	private  Map<String , TimerTask> tasks;
	private boolean ispause;
	private static   AloneTaskManager aloneTaskManager;
	private int i;
	private  AloneTaskManager(){
		timer=new Timer();
		tasks=new ConcurrentHashMap<>();
	}
	public   static AloneTaskManager getInstance(){
		if(aloneTaskManager==null){
		aloneTaskManager=new AloneTaskManager();
		}
		return  aloneTaskManager;
	}
	
	
	/**
	 * 加入一个任务并为该任务 分配一个id
	 * @param task
	 */
	public synchronized void addTask(final KeepTask task){
		if(task.getId()==null){
		   task.id=("CD-"+new Date().getTime()+"-"+i++);
		   TimerTask timerTask=new  TimerTask() {
			
			@Override
			public void run() {
				 //如果管理器被暂停 则暂停执行所有任务
				 if(!ispause){
					 if(task.isOver){ //死亡条件不同
				    	 tasks.remove(task.id); //移除任务队列
				    	 this.cancel(); //通知timer注销本任务
				    	 task.overExecute(); //执行终结任务
				    	 System.out.println("KeepTaskManager remove task :" + task.getId());
				      } 
					 task.excute();
				  }
				}
			};
			//加入
			tasks.put(task.id, timerTask);
			System.out.println("add AloneTask: "+ task.id);
			this.timer.schedule(timerTask, 0, task.howSecond); //开始执行
		}
	}
	
	
	/**
	 * 返回当前状态
	 * @return
	 */
	public  boolean  isPause(){
		return this.ispause;
	}
	
	/**
	 * 通知结束本任务
	 * @param task
	 */
	public synchronized void removeTask(KeepTask task){
		if(task.id !=null ){
			 task.over();
		}
	}
	
	/**
	 * 立即结束本任务
	 * @param task
	 */
	public synchronized void removeTaskNow(KeepTask task){
		if(task.id !=null ){
			 this.tasks.get(task.id).cancel();
			 this.tasks.remove(task.id);
			 task.over();
		}
	}
	
}
